草庐IT

c++ - Clang、std::next、libstdc++ 和 constexpr-ness

全部标签

c++ - 为什么 std::advance 不返回结果迭代器?

目前,std::advance是这样设计的:templatevoidadvance(InputIt&it,Distancen);但是,我经常发现自己想要这样的东西:templateInputItadvance(InputItit,Distancen);那么,当前设计背后的基本原理是什么?这是出于某些性能考虑吗?请注意,std::next和std::prev会返回结果迭代器。 最佳答案 没有技术原因阻止它返回对输入值的引用,如果不使用返回值,任何合理的编译器都应该能够优化它。因此,如果他们愿意,他们可以那样做。我认为他们的选择从API

c++ - Clang UBSAN 报告类型 'std::_Ios_Fmtflags' 的无效值

以下代码用clangUBSAN编译会崩溃#include#include#include#includetemplateinlinestd::stringfloatToString(Ti){printf("infloatToString\n");std::stringstreamss;ss.precision(6);ss用Clang3.6编译:$>clang++-3.6-fsanitize=undefined-fno-sanitize=float-divide-by-zero,vptr,function-fno-sanitize-recover-otesttest.cpp然后程序崩溃了

c++ - 指向结构的 std::vector 的指针

structStruct_t{intValue1;intValue2;};vectorStruct;Struct.resize(10,Struct_t());for(inti=0;i如何创建指向Struct[i]的指针?我想做的基本上是这样的,但我相信这可以做得更好:intvalue=6;Struct_ttemp=Struct[value],*s;s=&temp;s->Value1=42;s->Value2=6;主要目标是,我可以使用1行/函数轻松创建指向Struct[n]的指针。 最佳答案 到目前为止,提供的答案缺少房间里的大象。

c++ - 带 get 的数据结构,返回一个 constexpr (C++)

我目前正在寻找一种封装数据以供编译时访问的数据结构。因此,访问的值应该作为constexpr返回。虽然元组确实具有constexpr构造函数,但元组的get函数不返回constexpr。是否存在这样的数据结构,或者是否可以手动定义这样的数据结构?最终目标是将编译时已知值打包到某种对象中,将其(通过模板)传递给函数,访问那里的元素并将编译时已知值作为常量直接粘贴到二进制文件中。就我的目的而言,封装部分至关重要。 最佳答案 从C++14开始,std::tuple确实接受constexprstd::get#includeintmain()

c++ - clang 和 gcc 在处理模板生成和静态 constexpr 成员时的不同行为?

考虑以下程序(抱歉太长了;这是我能想到的表达问题的最短方式):#include#include#includeusingnamespacestd;std::vector&test_vector(){staticstd::vectorrv;returnrv;}templateclassRegistrarWrapper;templateclassRegistrar{Registrar(){auto&test_vect=test_vector();test_vect.push_back(std::type_index(typeid(T)));}friendclassRegistrarWrap

C++ std::ofstream - 移动放置指针

我正在将一些数据写入文件。有时,我想从内存中写入一个数据block,然后将put指针移动1、2或3个字节以保持4字节的数据边界格式。我可以制作一个包含零的新数据block并写入它,但这似乎没有必要且笨拙。如何将put指针移动1、2或3个字节?我不确定该怎么做,因为如果我调用seekp()肯定会将指针移到当前文件大小之外?而我假设ofstream.write()正确地处理了这个问题?即:它在写入数据时以某种方式调整文件大小? 最佳答案 我假设你正在做类似的事情,除了你不想写两个字节的数据,而是想写4个字节并加上一些填充。#includ

c++ - 缩短字符串时 std::string::resize 和 std::string::erase 之间的区别

当缩短std::string时,基本上有两种可能性:string.resize(length)或string.erase(length).既然我们知道字符串会变小,那两者有什么区别呢? 最佳答案 resize必须检查length>current或length-它的行为取决于比较的结果。erase总是减少字符串的长度在异常安全方面存在差异:resize:强保证:如果抛出异常,则字符串没有变化。(来自here)erase:C++98-等于resize;C++14-函数没有抛出版本(来自here)

c++ - 什么是 clang-check 的垃圾值

我收到以下警告:test.cpp:14:25:warning:Therightoperandof'/'isagarbagevaluereturn(std::abs(a)/size)>10;^~~~~对于这段代码:#include#include#include#includeusingnamespacestd;doublepitchDetect(conststd::vector>&dft,unsignedintsamplingRate)noexcept{if(dft.empty())return0.0;autoit=find_if(begin(dft),end(dft),[size=d

c++ - 在使用 gdb 检查核心转储时,有没有办法运行函数(如 std::string.size())?

考虑一个产生某些段错误并中止的C++程序。在使用gdb进行常规调试时,我可以执行以下操作并查看结果(gdb)r(gdb)pstr_var.size()其中str_var在文件中定义为std::string。但是,我在使用核心转储进行调试时遇到了一些问题。在我通过在gdb中加载核心转储之后gdbEXECUTABLEcore.pid然后在gdb终端运行以下命令(gdb)pstr_var.size()gdb说“如果没有调试过程,你就不能这样做。”我只能做bt(查看堆栈跟踪)或直接打印std::string变量之类的事情,但是找不到一种简单的方法来检查一些信息,例如打印std::string的

c++ - 如果基类包含数组成员,则派生类的构造函数不能是 constexpr

我想定义派生类型(SBar)的constexpr值,使用构造函数,其唯一参数是基类(SFoo)的变量,它仅用于初始化基类。当基类没有数组成员时,这很好用。但是,当我添加一个数组时,派生值不再是constexpr。不过,基类的简单拷贝确实会产生constexpr结果。为了安全起见,我已明确默认所有复制和移动构造函数。测试.cpp#defineUSE_ARRAYstructSFoo{constexprSFoo()=default;constexprSFoo(SFooconst&)=default;constexprSFoo(SFoo&)=default;constexprSFoo(SFoo